# !/usr/bin/env python
# -*- coding: utf-8 -*-
# ------------------------------
''''''

import copy
'''
浅拷贝
'''

a = [11, 22]
b = [33, 44]
c = [a, b]
print(id(a), id(c[0]))        # 2897683436 104 2897683436 104


d = copy.copy(c)
print('a:', id(a), 'd->a:', id(d[0]))   # a: 2953091179 208 d->a: 2953091179 208
print(id(c), id(d))       # 2727935370120 2727934132296
'''
总结：
浅拷贝拷贝内容，最外层的地址会发生改变，会发生改变，但是其中的内容的指向不会发生改变
exp:id(a)=id(d[0])   id[d]!=id(c),及重新开辟一块空间让一个新对象指向新空间，但是新
空间内部的对象与原来空间的对象指向不变
'''
# 练习：

a.append([55, 66])
print(c, '*'*15, d)
# [[11, 22, [55, 66]], [33, 44]] *************** [[11, 22, [55, 66]], [33, 44]]
c.append('456')
print(c, '*'*15, d)
# [[11, 22, [55, 66]], [33, 44], '456'] *************** [[11, 22, [55, 66]], [33, 44]]



'''
深拷贝
'''

e = copy.deepcopy(c)
print(id(e), id(c))
# 2305123603400 2305123574536
print(id(a), 'c->a:', id(c[0]), 'e->a:', id(e[0]))
# 2094550573768 c->a: 2094550573768 e->a: 2094550664456
print(e)
# [[11, 22, [55, 66]], [33, 44], '456']
'''
总结：
深拷贝就是新开辟一快空间让一个新对象指向，也原空间会对内容进行拷贝，但是要是原空间内部也有对象
又会重新开辟一块空间，将对这块空间的引用放在这个新开辟的大空间上
exp:
id(c)!=id(e) id(c[0])!=id(e[0]) 新对象，新内容，新内容里的新指向
'''

# 练习
a.append('111')
print('e->a:', e[0])
# e->a: [11, 22, [55, 66]]
c.append('222')
print(e)
# [[11, 22, [55, 66]], [33, 44], '456']



'''
浅拷贝与深拷贝之间区别:
浅拷贝只是开辟了一块新空间让一个新对象指向，但内部存的东西是一样的，内容里的对象
该指向谁就指向原来的（在新空间里）
深拷贝就仅仅是内容字样一样，但是内容中的对象再也和之前的就空间没有任何关系，内容
对象指向全新的空间，但空间的内容字样成分，与旧空间内容指向的内容成分字样是一样的
但指向关系全无

'''
'''
像拷贝元组这类不可变的类型时，浅拷贝是不起作用的，但是深拷备会更具元组内部是否有
可变类型，若有则拷贝，如没有则不拷贝
'''
# 练习：
aa = (1, 3)
bb = [11, 22]
cc = copy.copy(aa)
print(id(cc), id(aa))
# 1530240602312 1530240602312

dd = copy.deepcopy(aa)
print(id(dd), id(aa))
# 2930086351112 2930086351112
# 元组拷贝是而没有效果

bb2 = [33, 44]
ee = (bb, bb2)
ff = copy.copy(ee)
print(id(ee), id(ff))
# 3150404564936 3150404564936

jj = copy.deepcopy(ee)
print(id(ee), id(jj))
# 2628839131080 2628836736648  # 不同了
print(id(bb2), 'ee->bb2:', id(ee[-1]), 'jj->bb2:', id(jj[-1]))
# 1833240230408 ee->bb2: 1833240230408 jj->bb2: 1833240176968